package com.nicolas.pattern.prototype;

/**
 * ● Client（客户类）：让一个原型对象克隆自身从而创建一个新的对象，在客户类中只需要直接实例化或通过工厂方法等方式创建一个原型对象，
 * 再通过调用该对象的克隆方法即可得到多个相同的对象。由于客户类针对抽象原型类Prototype编程，
 * 因此用户可以根据需要选择具体原型类，系统具有较好的可扩展性，增加或更换具体原型类都很方便。
 * @author nicolas  2017年2月11日 -- 下午8:19:54
 */
public class PrototypeMain {

	public static void main(String[] args) {
		 WeeklyLog log_previous = new WeeklyLog();  //创建原型对象
	      log_previous.setName("张无忌");
	      log_previous.setDate("第12周");
	      log_previous.setContent("这周工作很忙，每天加班！");
	     
	      System.out.println("****周报****");
	      System.out.println("周次：" +  log_previous.getDate());
	      System.out.println("姓名：" +  log_previous.getName());
	      System.out.println("内容：" +  log_previous.getContent());
	      System.out.println("--------------------------------");
	     
	      WeeklyLog  log_new;
	      log_new  = log_previous.clone(); //调用克隆方法创建克隆对象
	      log_new.setDate("第13周");
	      System.out.println("****周报****");
	      System.out.println("周次：" + log_new.getDate());
	      System.out.println("姓名：" + log_new.getName());
	      System.out.println("内容：" + log_new.getContent());
	      
	      AttachmentShallow  attachmentShallow = new AttachmentShallow(); //创建附件对象
	      log_previous.setAttachmentShallow(attachmentShallow);  //将附件添加到周报中
	      log_new.setAttachmentShallow(attachmentShallow); 
	      //比较周报
          System.out.println("浅克隆--周报是否相同？ " + (log_previous ==  log_new));
          //比较附件--浅克隆
          System.out.println("浅克隆--附件是否相同？ " +  (log_previous.getAttachmentShallow() == log_new.getAttachmentShallow()));
          
          
          /*************************************深克隆测试***********************************/
          WeeklyLogDeep  log_previousD, log_newD = null;
          log_previousD  = new WeeklyLogDeep(); //创建原型对象
          AttachmentDeep  attachmentDeep = new AttachmentDeep(); //创建附件对象
          log_previousD.setAttachmentDeep(attachmentDeep);  //将附件添加到周报中
          try
          {
                 log_newD =  log_previousD.deepClone(); //调用深克隆方法创建克隆对象                  
          }
          catch(Exception e)
          {
                 System.err.println("克隆失败！");
          }
          //比较周报
          System.out.println("深克隆--周报是否相同？ " + (log_previousD ==  log_newD));
          //比较附件
          System.out.println("深克隆--附件是否相同？ " +  (log_previousD.getAttachmentDeep() == log_newD.getAttachmentDeep()));
	}

}
